SCREEN 12
DIM MinX, MinY, MaxX, MaxY
DIM XRazn, YRazn, MnogX, MnogY
DIM StpScX AS INTEGER, StpScY AS INTEGER
' Функции графиков
DEF FnY1 (x) = 150 - 20 * x
DEF FnY2 (x) = EXP(.8 * x)
DEF FnY3 (x) = 2 * x ^ 2 - 4
' Ф-ция поиска границ
DEF FnMinMax (x, y)
IF x < MinX THEN MinX = x
IF x > MaxX THEN MaxX = x
IF y < MinY THEN MinY = y
IF y > MaxY THEN MaxY = y
END DEF
' Экранное преобразование
DEF FnGetX (x) = x * MnogX - MinX * MnogX
DEF FnGetY (y) = y * MnogY - MaxY * MnogY
' Параметры трассировки функций
Str1 = -10: Str2 = 0: Str3 = -5
End1 = 10: End2 = 10: End3 = 10
Stp1 = .01: Stp2 = .03: Stp3 = .1
' Переменные для трассировки
x1 = Str1: x2 = Str2: x3 = Str3
y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
' Вычисляем параметры графиков
DO
Go = 0: y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = -1
IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = -1
IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = -1
i = FnMinMax(x1, y1) ' Ищем границы
i = FnMinMax(x2, y2)
i = FnMinMax(x3, y3)
LOOP WHILE Go
PRINT
PRINT " "; INT(MinX); INT(MinY); INT(MaxX); INT(MaxY)
' Реинициализация трассировки
x1 = Str1: x2 = Str2: x3 = Str3
y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
' Старые координаты(Прошлый шаг трассировки)
xo1 = x1: xo2 = x2: xo3 = x3
yo1 = y1: yo2 = y2: yo3 = y3
' Делаем фрейм пошире, чтобы больше было видно
' + сетку, если она где-то рядом
XRazn = MaxX - MinX
YRazn = MinY - MaxY
MinX = MinX - XRazn / 4
MaxX = MaxX + XRazn / 4
MinY = MinY + YRazn / 4
MaxY = MaxY - YRazn / 4
' Для преобразования координат в экранные
XRazn = MaxX - MinX ' Разности координат графиков
YRazn = MinY - MaxY
IF XRazn = 0 THEN XRazn = .00001
IF YRazn = 0 THEN YRazn = .00001
MnogX = 640 / XRazn ' Отнош. к разностям коо. гр.
MnogY = 480 / YRazn
StpScX = 1: StpScY = 1 ' Шаг сетки
' Если сетка не умещается увеличиваем шаг сетки
DO: ScTst = 0
IF ABS(XRazn / StpScX) > 160 THEN StpScX = StpScX * 10: ScTst = -1
IF ABS(YRazn / StpScY) > 120 THEN StpScY = StpScY * 10: ScTst = -1
LOOP WHILE ScTst
' Нарисуем сетку
DlSc = SQR(1 / ABS(XRazn / StpScX) + 1 / ABS(XRazn / StpScX)) * 10
IF DlSc > 10 THEN DlSc = 10
IF DlSc < 2 THEN DlSc = 2
LINE (FnGetX(MinX), FnGetY(0))-(FnGetX(MaxX), FnGetY(0)), 8
LINE (FnGetX(0), FnGetY(MinY))-(FnGetX(0), FnGetY(MaxY)), 8
FOR i = INT(MinX) TO INT(MaxX) STEP StpScX
LINE (FnGetX(i), FnGetY(0) - DlSc)-(FnGetX(i), FnGetY(0) + DlSc), 8
NEXT
FOR i = INT(MinY) TO INT(MaxY) STEP StpScY
LINE (FnGetX(0) - DlSc, FnGetY(i))-(FnGetX(0) + DlSc, FnGetY(i)), 8
NEXT
' Рисуем графики
DO
Go = 0: y1 = FnY1(x1): y2 = FnY2(x2): y3 = FnY3(x3)
IF x1 < End1 THEN x1 = x1 + Stp1: y1 = FnY1(x1): Go = -1
IF x2 < End2 THEN x2 = x2 + Stp2: y2 = FnY2(x2): Go = -1
IF x3 < End3 THEN x3 = x3 + Stp3: y3 = FnY3(x3): Go = -1
LINE (FnGetX(xo1), FnGetY(yo1))-(FnGetX(x1), FnGetY(y1)), 9
LINE (FnGetX(xo2), FnGetY(yo2))-(FnGetX(x2), FnGetY(y2)), 10
LINE (FnGetX(xo3), FnGetY(yo3))-(FnGetX(x3), FnGetY(y3)), 14
xo1 = x1: xo2 = x2: xo3 = x3 ' Старые координаты
yo1 = y1: yo2 = y2: yo3 = y3
LOOP WHILE Go
WHILE INKEY$ = "": WEND ' Ждать кнопку
Тестирование выполнено в программе QB64 ( Скачать )